zookeeper 面试题归总

Zookeeper 是个数据库,文件存储系统,并且有监听通知机制(观察者模式)
1 zookeeper 集群如何进行故障迁移?
ZooKeeper处理节点的故障转移通过选举新的Leader节点来完成。ZooKeeper集群中的每个节点都有一个状态,可以是Leader、Follower或Observer。当Leader节点出现故障时,集群中的其他节点会开始一个新的Leader选举过程。选举规则是,节点会向其他节点发送一个请求,请求得到超过半数节点的认可后,该节点就成为新的Leader。
一旦新的Leader节点选举成功,集群中的所有节点都会知道新的Leader节点是谁,然后继续处理客户端请求。在这个过程中,ZooKeeper保持了数据的一致性和可用性,确保集群的正常运行。当故障节点恢复后,它会重新加入集群并成为Follower节点,继续参与集群的工作。
2 zookeeper 有遇到过节点过多的情况吗?
zookeeper的一个目录下的znode节点过多,导致在执行ls 和rmr命令的时候,直接终止会话退出,无法递归删除下面的子节点,具体情况如下(生产环境的zookeeper是clickhouse的元数据管理集群,有一个故障是clickhouse副本同步堆积问题),接下来的操作需要知道这个子节点中的znode有序节点是怎么命名的,一般都是‘节点名称-000000xxxxxx’,由于无法获取子节点的列表,所以需要通过循环删除节点找到,大概的区间,然后再逐条尝试删除node
这边写了一个jave的操作代码如下
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import java.io.IOException;
public class DeleChildNode {
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
if (0 == args.length) {
System.out.println("没有zkurl和zkpath参数,自动退出,参数样例:127.0.0.1:2181 /clickhouse/2/table/host/replices/queue/ 10000 9999999999 10001");
System.exit(0);
}
System.out.println("zkurl:" + args[0] + "\tzkpath:" + args[1] + "\t起始位置:" + args[2] + "\t结束位置:" + args[3] + "\t步长:" + args[4] );
ZooKeeper zk = new ZooKeeper(args[0], 500000, new Watcher() {
// 监控所有被触发的事件
public void process(WatchedEvent event) {
// dosomething
System.out.println("成功建立监听连接。。。");
}
});
String t;
int start = Integer.parseInt(args[2]);
int end = Integer.parseInt(args[3]);
int length = Integer.parseInt(args[4]);
String queue;
String[] zore = {"0", "00", "000", "0000", "00000"};
for (int i = start; i < end; i = i + length) {
try {
t = i + "";
queue = "queue-" + zore[10 - t.length() - 1] + t;
// System.out.println(args[1] + queue);
zk.delete(args[1] + queue, -1);
System.out.println("success:"+args[1] + queue);
} catch (Exception e) {
System.out.println("fail:"+e.getMessage());
}
}
zk.close();
}
}
3 什么事 CAP 定理?
CAP(Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性))是分布式系统中的三个重要特性。分布式系统要满足CAP中的两个 特性,但无法同时满足三个特性,只能在C、A、P中选择两个。
一致性(Consistency):指的是分布式系统中所有的节点在同一时间具有相同的数据副本,即更新操作成功并返回客户端后,所有的节点访问数据的结果都是一致的。 可用性(Availability):指系统提供的服务必须一直处于可用状态,即使出现了部分故障,也不能影响系统的正常运行。 分区容错性(Partition tolerance):指系统能够在网络分区的情况下,仍能保证一致性和可用性。 在分布式系统中,由于网络延迟、节点故障等原因,可能会出现数据不一致的情况。因此,在设计分布式系统时,需要根据实际情况,权衡C、A、P三个特性,选择最适合自己的方案。
ZooKeeper保证的是一致性和分区容错性,ZooKeeper不能保证每次服务请求的可⽤ 性,在极端环境下,ZooKeeper可能会丢弃⼀些请求,消费者程序需要重新请求才能获得结果。 另外在进⾏leader选举时集群都是不可⽤,所以说,ZooKeeper不能保证服务可⽤性
4 什么是 ZAB 协议
ZAB(ZooKeeper Atomic Broadcast)协议是ZooKeeper的核心算法,用于保证ZooKeeper集群的数据一致性和高可用性。
在ZooKeeper中,所有的数据操作都必须经过ZAB协议进行广播,然后由所有的服务器按照相同的顺序执行,从而保证集群中所有服务器的数据状态是一致的。ZAB协议主要包括两个阶段: 1.Leader选举阶段:集群中的所有服务器通过竞选Leader的方式,选出一个Leader来负责数据的同步和更新。 2.数据同步阶段:Leader负责将客户端的请求广播给集群中的所有服务器,并根据一定的顺序进行数据同步和更新。
ZAB协议的核心思想是,保证集群中所有服务器的数据状态是一致的,并且在Leader故障时能够快速选举新的Leader,从而保证集群的高可用性。
什么是Zab
Zab(Zookeeper Atomic Broadcast)是为ZooKeeper协设计的崩溃恢复原子广播协议, 它保证Zookeeper集群数据的一致性和命令的全局有序性
zab在广播状态中保证以下特征:
可靠传递: 如果消息m由一台服务器传递,那么它最终将由所有服务器传递。
全局有序: 如果一个消息a在消息b之前被一台服务器交付,那么所有服务器都交付了a和b,并且a先于b。
因果有序: 如果消息a在因果上先于消息b并且二者都被交付,那么a必须排在b之前。
有序性是zab协议必须要保证的一个很重要的属性,因为zookeeper是以类似目录结构的数据结构存储数据的,必须要求命名的有序性
比如一个命名a创建路径为/test,然后命名b创建路径为/test/123,如果不能保证有序性b命名在a之前,b命令会因为父节点不存在而创建失败。
整个写请求类似一个二阶段的提交。当收到客户端的写请求的时候会经历以下几个步骤:
- Leader收到客户端的写请求,生成一个事务(Proposal),其中包含了zxid;
- Leader开始广播该事务,需要注意的是所有节点的通讯都是由一个FIFO的队列维护的;
- Follower接受到事务之后,将事务写入本地磁盘,写入成功之后返回Leader一个ACK;
- Leader收到过半的ACK之后,开始提交本事务,并广播事务提交信息
- 从节点开始提交本事务。
由以上流程可知,zookeeper通过二阶段提交来保证集群中数据的一致性,因为只需要收到过半的ACK 就可 以提交事务,所以zookeeper的数据并不是强一致性。 zab协议的有序性保证是通过几个方面来体现的,第一是,服务之前⽤TCP协议进行通讯,保证在网络 传输中的有序性;第二,节点之前都维护了一个FIFO的队列,保证全局有序性;第三,通过全局递增的zxid保证因果有序性。
5 简述Leader选举算法和流程
选举算法和流程:FastLeaderElection (默认提供的选举算法)
⽬前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选择举过程如下: 一:服务器1启动,给⾃⼰投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息, 服务器1的状态⼀直属于Looking。
二:服务器2启动,给⾃⼰投票,同时与之前启动的服务器1交换结果,由于服务器2的编号⼤所以服务 器2胜出,但此时投票数没有⼤于半数,所以两个服务器的状态依然是LOOKING。
三:服务器3启动,给⾃⼰投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最⼤所以 服务器3胜出,此时投票数正好⼤于半数,所以服务器3成为leader,服务器1,2成为follower。
四:服务器4启动,给⾃⼰投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号⼤,但之前服务器3已经胜出,所以服务器4只能成为follower。
五:服务器5启动,后⾯的逻辑同服务器4成为follower。
如果一个节点收到了超过一半的投票,就认为自己成为了新的Leader,并开始向其 他节点发送消息,宣布自己是Leader,并开始接受客户端的请求。如果没有节点收到超过一半的投票,选举失败,需要重新开始新一轮的Leader选举。
总之,Leader选举算法的目的是为了在集群中选出一个节点成为Leader,保证系统的高可用性和数据一致性。它的流程是一个不断循环的过程,直到选出一个新的Leader或者选举失败
6 Zookeeper 中有几种节点类型?
在Zookeeper中,有以下几种节点类型:
1.持久节点(Persistent Nodes):这种节点在创建后,会一直存在于Zookeeper中,直到被显示删除。
2.临时节点(Ephemeral Nodes):这种节点在创建它的客户端会话结束时被自动删除。如果客户端因为某种原因(比如网络问题)而断开连接,那么与之关联的临时节点也会被删除。
3.持久顺序节点(Persistent Sequential Nodes):这种节点在创建时会自动分配一个递增的编号,编号是唯一的。节点的名称是由用户指定的前缀和分配的编号组成的。这种节点的特点是它们在同级节点中按照编号的顺序排列。
4.临时顺序节点(Ephemeral Sequential Nodes):这种节点结合了临时节点和持久顺序节点的特点。它们在客户端会话结束时被删除,并按照编号的顺序排列。